﻿using System;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Management;

namespace StudentSynchronization.Daemon
{
    public class UpdateControl
    {
        private ManagementEventWatcher watcher;

        public void DiskInsertionEventHandler()
        {
            // 创建查询以监控硬盘插入事件
            string query = "SELECT * FROM Win32_VolumeChangeEvent WHERE EventType = 2";
            watcher = new ManagementEventWatcher(query);

            // 注册事件处理器
            watcher.EventArrived += new EventArrivedEventHandler(EventArrived);
            watcher.Start();
        }

        private void EventArrived(object sender, EventArrivedEventArgs e)
        {
            var data = e.NewEvent.Properties;
            foreach (var property in data)
            {
                if (property.Name == "DriveName")
                {
                    var path = property.Value.ToString() + "/82008";
                    if (Directory.Exists(path))
                    {
                        Run(path);
                    }

                }
            }
        }
        public static void Run(string usbDrivePath)
        {
            var pro = ProcessData.processlist.FirstOrDefault();
            if (pro == null) return;
            var findpro = Process.GetProcessesByName(pro.Name.Replace(".exe", "")).FirstOrDefault(p => p.MainModule.FileName == pro.Path + Path.DirectorySeparatorChar + pro.Name);
            if (findpro != null && findpro.Id > 0)
            {
                findpro.Kill();
            }
            pro.IsRestart = false;
            string targetPath = @"C:\Users\Administrator\Desktop\net8.0-windows"; // 替换为目标路径  
            string logFilePath = Path.Combine(usbDrivePath, "operation_log.txt");

            try
            {


                // 遍历U盘中的文件和文件夹并进行替换  


                TraverseAndReplace(usbDrivePath, targetPath, logFilePath);

            }
            catch (Exception ex)
            {
                // 记录异常到日志文件  
                LogWithTimestamp(logFilePath, "操作失败: " + ex.Message);
            }
            pro.IsRestart = true;
        }

        static void TraverseAndReplace(string sourcePath, string targetPath, string logFilePath)
        {
            // 获取源路径中的所有文件和文件夹（递归）  
            var allSourceFiles = Directory.GetFiles(sourcePath, "*", SearchOption.AllDirectories);
            var allSourceDirs = Directory.GetDirectories(sourcePath, "*", SearchOption.AllDirectories);

            // 确保目标路径存在（如果不存在则创建）  
            Directory.CreateDirectory(targetPath);

            // 处理文件  
            foreach (var sourceFile in allSourceFiles)
            {
                string relativePath = sourceFile.Substring(sourcePath.Length + 1).Replace(Path.DirectorySeparatorChar.ToString(), "\\"); // 获取相对路径并修正分隔符  
                string destFile = Path.Combine(targetPath, relativePath);

                // 创建目标文件的目录（如果不存在）  
                Directory.CreateDirectory(Path.GetDirectoryName(destFile));

                // 如果目标文件存在，则删除并记录日志  
                if (File.Exists(destFile))
                {
                    File.Delete(destFile);
                    LogWithTimestamp(logFilePath, "删除文件: " + destFile);
                }

                // 复制文件并记录日志  
                File.Copy(sourceFile, destFile, true);
                LogWithTimestamp(logFilePath, "复制文件: " + sourceFile + " 到 " + destFile);
            }

            // 处理文件夹（通常文件夹会通过文件复制隐含处理，但这里可以记录空文件夹的创建）  
            foreach (var sourceDir in allSourceDirs)
            {
                string relativePath = sourceDir.Substring(sourcePath.Length + 1).Replace(Path.DirectorySeparatorChar.ToString(), "\\"); // 获取相对路径并修正分隔符  
                string destDir = Path.Combine(targetPath, relativePath);

                // 如果目标文件夹不存在且不是源路径本身（避免重复创建源路径），则创建并记录日志  
                if (!Directory.Exists(destDir) && !string.Equals(sourcePath, sourceDir.TrimEnd(Path.DirectorySeparatorChar), StringComparison.OrdinalIgnoreCase))
                {
                    Directory.CreateDirectory(destDir);
                    LogWithTimestamp(logFilePath, "创建文件夹: " + destDir);
                }
                // 注意：如上所述，文件夹的“替换”通常是通过文件复制来隐含完成的。  
            }
        }

        static void LogWithTimestamp(string logFilePath, string message)
        {
            // 获取当前时间戳并格式化  
            string timestamp = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff");
            // 将时间戳和消息写入日志文件  
            File.AppendAllText(logFilePath, Environment.NewLine + timestamp + " " + message);
        }
    }
}
